import 'package:dio/dio.dart';

import '../constants/index.dart';
import 'Toast.dart';
import 'TokenManager.dart';

class RequestDio {
  //创建实例
  final Dio _dio = Dio();
  RequestDio() {
    // 设置请求地址
    _dio.options.baseUrl = GlobalVariable.BASE_URL;
    // 设置超时时间
    _dio.options.connectTimeout =
        const Duration(seconds: GlobalVariable.TIMEOUT);
    _dio.options.receiveTimeout =
        const Duration(seconds: GlobalVariable.TIMEOUT);
    // _dio
    //   ..options.baseUrl = GlobalVariable.BASE_URL;
    //   ..options.connectTimeout =
    //     const Duration(seconds: GlobalVariable.TIMEOUT);
    //   ..options.receiveTimeout =
    //     const Duration(seconds: GlobalVariable.TIMEOUT);
    _requestInterceptors();
  }
//get请求
  get(String url, {Map<String, dynamic>? params}) async {
    final result = await _dio.get(url, queryParameters: params);
    return _handleResult(result);
  }

  //post请求
  post(String url, {Map<String, dynamic>? data}) async {
    final result = await _dio.post(url, data: data);
    return _handleResult(result);
  }

  //put请求
  put(String url, {Map<String, dynamic>? data}) async {
    final result = await _dio.put(url, data: data);
    return _handleResult(result);
  }

  //delete请求
  delete(String url, {Map<String, dynamic>? data}) async {
    final result = await _dio.delete(url, data: data);
    return _handleResult(result);
  }

//统一处理返回结果
  _handleResult(Response<dynamic> response) {
    if (response.data['code'] == 10000) {
      return response.data['data'];
    }
    //抛出错误提示程序员
    PromptAction.showError(response.data['message']);
    throw Exception(response.data['message']);
  }

  //拦截器
  _requestInterceptors() {
    _dio.interceptors.add(
      InterceptorsWrapper(
        //请求拦截器
        onRequest: (RequestOptions options, RequestInterceptorHandler handler) {
          // 如果你想完成请求并返回一些自定义数据，你可以使用 `handler.resolve(response)`。
          // 如果你想终止请求并触发一个错误，你可以使用 `handler.reject(error)`。
          final token = tokenManager.getToken();
          if (token.isNotEmpty) {
            options.headers['Authorization'] = 'Bearer $token';
          }
          return handler.next(options);
        },
        //响应拦截器
        onResponse: (Response response, ResponseInterceptorHandler handler) {
          // 如果你想终止请求并触发一个错误，你可以使用 `handler.reject(error)`。
          //!针对请求结果大于等于200&&小于等于300
          if (response.statusCode! >= 200 && response.statusCode! < 300) {
            return handler.next(response);
          } else {
            // 4开头(客户端异常->请求路径 错误/鉴权(token))5开头(服务)
            //针对401授权失败的情况提示用户
            PromptAction.showError(response.data['message']);
            //然后抛出异常的future /鸿蒙前端 的promise
            return handler
                .reject(DioException(requestOptions: response.requestOptions));
          }
        },
        //异常处理
        onError: (DioException error, ErrorInterceptorHandler handler) {
          // 如果你想完成请求并返回一些自定义数据，你可以使用 `handler.resolve(response)`。
          return handler.next(error);
        },
      ),
    );
  }
}

final requestDio = RequestDio();
